package design._02_singleton.懒汉2;
/**
 * 懒汉模式的volatile会禁止重排序，影响性能。
 * @author nrzt
 *
 */
public class LazySingleton {
	//volatile 保证了原子性 即多线程读写的可见性
	private volatile static LazySingleton instance = null;
	
	private LazySingleton() { }
	
	//多线程情况下，需要同步；但是性能较低
//	synchronized public static LazySingleton getInstance() {
//		if (instance == null) {
//			instance = new LazySingleton();
//		}
//		return instance;
//	}
	//性能较上面有优化 2个线程同时执行 （instance == null） 时，会产生多个实例
//	public static LazySingleton getInstance() {
//		if (instance == null) {
//			synchronized (LazySingleton.class) {
//				instance = new LazySingleton();
//			}
//		}
//		return instance;
//	}
	
	//双重判断，实现预期效果
	//如果使用双重检查锁定来实现懒汉式单例类，需要在静态成员变量instance之前增加修饰符volatile
	public static LazySingleton getInstance() {
		//第一重判断
		if (instance == null) {
			//锁定代码块
			synchronized (LazySingleton.class) {
				//第二重判断
				if (instance == null) {
					instance = new LazySingleton(); //如果不是原子操作，这一步会出现重排序，即拿到没有真正初始化的对象。
				}
			}
		}
		return instance;
	}
}	
